#include "encoder.h"

Encoder::Encoder(qlonglong n, qlonglong k, QObject *parent) :
  QObject(parent),
  m_n(n),
  m_k(k),
  m_r(n-k),
  m_gf(37), // инициализировать поле
  m_g(1, 1)
{
#ifdef ERRS
  if ( n <= 0 || k <= 0 || n <= k ) { // проверка предусловия
    error("Encoder::Encoder(): код задан некорректно.");
  }
#endif

  // создание генераторного полинома
  for (int i = 0; i < m_r; ++i) {
    m_g = m_gf.conv( m_g, QVector<qlonglong>() << m_gf.alog(i) << m_gf.alog(0) );
  }
}

// кодировать
// предусловие: входной вектор должен быть длинны m_k
// постусловие: выходной вектор должен быть длинны m_n
QVector<qlonglong> Encoder::code(QVector<qlonglong> f) {
#ifdef ERRS
  if ( f.size() != m_k ) { // проверка предусловия
    error("Encoder::code(): длинна входного вектора не m_k.");
  }
#endif

  QVector<qlonglong> res = m_gf.conv(f, m_g);

#ifdef ERRS
  if ( res.size() != m_n ) { // проверка постусловия
    error("Encoder::code(): длинна выходного вектора не m_n.");
  }
#endif

  return res;
}
